package com.ldzy.webase.service.impl;

import com.ldzy.webase.dao.NoticeMapper;
import com.ldzy.webase.entity.Notice;
import com.ldzy.webase.exception.ExceptionResponse;
import com.ldzy.webase.exception.ExceptionResponseCode;
import com.ldzy.webase.service.NoticeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

/**
 * @author ：Lq
 * @version ：1.0
 * @date ：2022/11/20 11:05
 * @description ：t_notice/t_notice_relation-消息表/消息与用户关系表-业务层
 */
@Service
public class NoticeServiceImpl implements NoticeService {
    @Autowired
    NoticeMapper noticeMapper;

    /**
     * @author ：Lq
     * @date ：2022/11/20 11:06
     * @description ：根据学生uid查询用户需要接收的所有通知-有联合索引[noticeRelationId和uid组成联合索引]
     * 1. not in查询，根据学生id查询t_notice_relation表里是否有包含对应noticeId的通知，包含且已经删除则不予发送
     * 2. 如果用户注册时间大于通知时间则不予发送
     * 3. 如果t_notice_relation表里的通知记录已被删除则不予发送
     */
    @Override
    public List<Notice> getAllNoticeByUid(Integer uid) {
        List<Notice> noticeList = noticeMapper.getAllNoticeByUid(uid);

        if(noticeList.size() == 0){
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOTICE_NOT); // (220, "暂无最新消息通知")
        }

        // 循环遍历查询出来的消息通知，格式化消息发送日期
        for (int i = 0; i < noticeList.size(); i++) {
            // 取出消息发送日期
            Timestamp createDate = noticeList.get(i).getCreateDate();

            // 获取当前时间
            Date nowDate = new Date();
            // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
            long times = nowDate.getTime() - createDate.getTime();
            long day = times / (24 * 60 * 60 * 1000); // 天数
            long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
            long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
            long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

            // 创建可变字符缓冲对象StringBuffer，只是为了方便
            StringBuffer sb = new StringBuffer();

            if (day > 28) {
                // 如果大于28天不执行操作
            } else if (day > 0) {
                sb.append(day + "天前");
            } else if (hour > 0) {
                sb.append(hour + "小时前");
            } else if (min > 0) {
                sb.append(min + "分钟前");
            } else if (sec < 10) {
                sb.append("刚刚");
            } else {
                sb.append(sec + "秒前");
            }

            // sb.toString()转换成字符串对象存入
            noticeList.get(i).setSendDateInterval(sb.toString());
        }

        return noticeList;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/20 11:06
     * @description ：当用户点击阅读消息之后，直接根据用户接收的通知noticeId和学生uid添加对应消息记录到t_notice_relation表中，默认设置为已阅读状态[1]
     */
    @Override
    public int addNoticeRelation(Integer noticeId, Integer uid) {
        int i = noticeMapper.addNoticeRelation(noticeId, uid);

        if(i == 0){
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOT_TOKEN); // (401, "服务器开小差了")
        }

        return i;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/20 11:06
     * @description ：当用户点击删除/清空消息时，根据noticeId和uid将isDelete字段修改为1
     */
    @Override
    public int editNoticeRelation(Integer noticeId, Integer uid) {
        int i = noticeMapper.editNoticeRelation(noticeId, uid);

        if(i == 0){
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOT_TOKEN); // (401, "服务器开小差了")
        }

        return i;
    }
}
